#include <iostream>
#include <array>
class A {
public:
	A() {
		std::cout << "Class Constructor" << std::endl;
	}
	~A() {
		std::cout << "Class DeConstructor" << std::endl;
	}

	A(const A& other) {
		std::cout << "Class A Copy Constructor" << std::endl;
	}

	A(A&& other) noexcept {
		std::cout << "Class A Move Constructor" << std::endl;
	}

public:
	A& operator=(const A& other) {
		std::cout << "Class A Copy Assign" << std::endl;
		return *this;
	}

	A& operator=(A&& other) noexcept {
		std::cout << "Class A Move Assign" << std::endl;
		return *this;
	}
};

A GetA() {
	A a;
	return a;
}

static int num = 20;
int GetGlobalNum() {
	return num;
}

int GetNum() {
	int num1 = 20;
	return num1;
}

int main() {
	//A a1 = GetA();

	//A a1;

	/*
	&GetGlobalNum();
	&GetNum();
	*/

	//A a2 = std::move(a1);
	
	//A&& ra1 = std::move(a1);
	//A a3 = ra1;

	/*
	int& ra = GetNum();
	int&& ra1 = num;
	*/

	//const int& cra = GetNum();

	A a1;
	A a2;
	a2 = std::move(a1);


	int&& a = 10;
	a = 2;
	std::cout << a << std::endl;

	return 0;
}